package com.meihuayishu.backend.repository;

import com.meihuayishu.backend.entity.DivinationRecord;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 占卜记录数据访问接口
 */
@Repository
public interface DivinationRecordRepository extends JpaRepository<DivinationRecord, String> {
    
    /**
     * 根据用户ID查找占卜记录
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 分页的占卜记录
     */
    Page<DivinationRecord> findByUserIdOrderByCreatedAtDesc(String userId, Pageable pageable);
    
    /**
     * 根据用户ID和类型查找占卜记录
     * @param userId 用户ID
     * @param divinationType 占卜类型
     * @param pageable 分页参数
     * @return 分页的占卜记录
     */
    Page<DivinationRecord> findByUserIdAndDivinationTypeOrderByCreatedAtDesc(
            String userId, DivinationRecord.DivinationType divinationType, Pageable pageable);
    
    /**
     * 根据用户ID和日期范围查找占卜记录
     * @param userId 用户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param pageable 分页参数
     * @return 分页的占卜记录
     */
    Page<DivinationRecord> findByUserIdAndCreatedAtBetweenOrderByCreatedAtDesc(
            String userId, LocalDateTime startDate, LocalDateTime endDate, Pageable pageable);
    
    /**
     * 根据用户ID、类型和日期范围查找占卜记录
     * @param userId 用户ID
     * @param divinationType 占卜类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param pageable 分页参数
     * @return 分页的占卜记录
     */
    Page<DivinationRecord> findByUserIdAndDivinationTypeAndCreatedAtBetweenOrderByCreatedAtDesc(
            String userId, DivinationRecord.DivinationType divinationType, 
            LocalDateTime startDate, LocalDateTime endDate, Pageable pageable);
    
    /**
     * 根据用户ID和记录ID查找单个记录
     * @param userId 用户ID
     * @param recordId 记录ID
     * @return 占卜记录
     */
    Optional<DivinationRecord> findByUserIdAndRecordId(String userId, String recordId);
    
    /**
     * 查找用户的收藏记录
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 分页的收藏记录
     */
    Page<DivinationRecord> findByUserIdAndIsFavoriteTrueOrderByFavoritedAtDesc(String userId, Pageable pageable);
    
    /**
     * 统计用户的占卜记录总数
     * @param userId 用户ID
     * @return 记录总数
     */
    long countByUserId(String userId);
    
    /**
     * 统计用户的收藏记录总数
     * @param userId 用户ID
     * @return 收藏总数
     */
    long countByUserIdAndIsFavoriteTrue(String userId);
    
    /**
     * 统计用户各类型占卜记录数量
     * @param userId 用户ID
     * @return 类型分布统计
     */
    @Query("SELECT dr.divinationType, COUNT(*) FROM DivinationRecord dr " +
           "WHERE dr.userId = :userId GROUP BY dr.divinationType")
    List<Object[]> countByUserIdGroupByDivinationType(@Param("userId") String userId);
    
    /**
     * 计算用户占卜记录的平均评分
     * @param userId 用户ID
     * @return 平均评分
     */
    @Query("SELECT AVG(dr.feedbackRating) FROM DivinationRecord dr " +
           "WHERE dr.userId = :userId AND dr.feedbackRating IS NOT NULL")
    Double getAverageRatingByUserId(@Param("userId") String userId);
    
    /**
     * 查找用户今日的占卜记录数量
     * @param userId 用户ID
     * @param startOfDay 今日开始时间
     * @param endOfDay 今日结束时间
     * @return 今日占卜次数
     */
    long countByUserIdAndCreatedAtBetween(String userId, LocalDateTime startOfDay, LocalDateTime endOfDay);
    
    /**
     * 删除用户的占卜记录
     * @param userId 用户ID
     * @param recordId 记录ID
     * @return 删除的记录数
     */
    long deleteByUserIdAndRecordId(String userId, String recordId);
}